#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "WS2812_blink.h"
#include "iot_button.h"
#include "esp_log.h"
#include "button_gpio.h"
#include "sdkconfig.h"

static const char *TAG = "example";
// 按钮引脚
#define BOOT_BUTTON_NUM 0
// 按钮电平
#define BUTTON_ACTIVE_LEVEL 0

static bool led_on = false; // 全局变量，跟踪灯的状态

/**
 * @brief 按钮事件回调函数
 * @param arg 按钮句柄
 * @param data 按钮事件数据
 */
static void button_event_cb(void *arg, void *data)
{
    // 打印按钮事件
    iot_button_print_event((button_handle_t)arg);
    
    // 切换灯的状态
    led_on = !led_on; // 切换状态

    int i;
    if (led_on) {
        // 开灯
        for (i = 0; i < LED_NUM; i++)
        {
            set_rgb(i, COLOR_U32(0xff, 0x0, 0x0)); // 红色
        }
        ESP_LOGI(TAG, "LED turned ON");
    } else {
        // 关灯
        for (i = 0; i < LED_NUM; i++)
        {
            set_rgb(i, COLOR_U32(0x0, 0x0, 0x0)); // 关闭
        }
        ESP_LOGI(TAG, "LED turned OFF");
    }
    // 发送数据
    send_data();
}

/**
 * @brief 按钮初始化
 * @param button_num 按钮引脚
 */
void button_init(uint32_t button_num)
{
    // 按钮配置
    const button_config_t btn_cfg = {0};
    // 按钮GPIO配置
    const button_gpio_config_t gpio_cfg = {
        .gpio_num = button_num,// 按钮引脚
        .active_level = BUTTON_ACTIVE_LEVEL,// 按钮电平
        .enable_power_save = true,// 启用电源管理
        .disable_pull = false,// 禁用拉电阻
    };
    // 按钮句柄
    button_handle_t btn = NULL;
    // 创建按钮设备
    esp_err_t ret = iot_button_new_gpio_device(&btn_cfg, &gpio_cfg, &btn);
    assert(ret == ESP_OK);
    // 注册按钮事件回调函数
    ret = iot_button_register_cb(btn, BUTTON_PRESS_DOWN, NULL, button_event_cb, NULL);
    ESP_ERROR_CHECK(ret);
}
void app_main(void)
{
    // 初始化WS2812
    init_ws2812();
    // 初始化按钮
    button_init(BOOT_BUTTON_NUM);

    /* 进入循环 */
    while (1)
    {
        vTaskDelay(LED_PERIOD / portTICK_PERIOD_MS);
    }
}